package ar.com.seminario.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import ar.com.seminario.common.persistence.dao.GenericDao;
import ar.com.seminario.common.service.definition.BaseService;
import ar.com.seminario.common.service.exception.ServiceException;
import ar.com.seminario.dao.SolicitudCandidatoDao;
import ar.com.seminario.dto.SolicitudCandidatoDto;
import ar.com.seminario.model.Candidato;
import ar.com.seminario.model.SolicitudCandidato;
import ar.com.seminario.model.SolicitudIngreso;
import ar.com.seminario.model.enumerados.EstadoSolicitudCandidato;

/**
 * Servicio de acceso a las entrevistas.
 * 
 * @author Pablo Lamas
 * 
 */
@Service
@Transactional
public class SolicitudCandidatoService extends BaseService implements ISolicitudCandidatoService {

	/**
	 * Servicio de manejo de entidades de {@link Candidato}
	 */
	@Autowired
	private ICandidatoService candidatoService;

	/**
	 * Servicio de manejo de entidades de {@link SolicitudIngreso}
	 */
	@Autowired
	private ISolicitudIngresoService solicitudIngresoService;

	public SolicitudCandidatoDto getSolicitudCandidatoDto(SolicitudCandidato solicitudCandidato) {

		try {

			SolicitudCandidatoDto solicitudCandidatoDto = new SolicitudCandidatoDto();
			solicitudCandidatoDto.setCandidatoDto(this.candidatoService.getCandidatoDto(solicitudCandidato
					.getCandidato()));
			solicitudCandidatoDto.setEstadoRelacionId(solicitudCandidato.getEstadoSolicitudCandidato().getId());
			solicitudCandidatoDto.setSolicitudIngresoDto(this.solicitudIngresoService
					.getSolicitudDtoPorId(solicitudCandidato.getSolicitudIngreso().getId()));

			return solicitudCandidatoDto;
			
		} catch (ServiceException e) {
			e.printStackTrace();
		}

		return null;
	}

	public void saveSolicitudCandidato(SolicitudIngreso solicitudIngreso, Candidato candidato) throws ServiceException {

		try {

			SolicitudCandidato solicitudCandidato = new SolicitudCandidato();
			solicitudCandidato.setCandidato(candidato);
			solicitudCandidato.setSolicitudIngreso(solicitudIngreso);
			solicitudCandidato.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.PRIMER_ENTREVISTA);

			final GenericDao<SolicitudCandidato, Long> dao = this.getDaoFactory().newDao();
			dao.save(solicitudCandidato);

		} catch (Exception e) {
			throw new ServiceException(e);
		}

	}

	public List<SolicitudCandidatoDto> getPostulantesAsociados(Long idSolicitudIngreso) throws ServiceException {

		try {

			List<SolicitudCandidatoDto> postulantesAsociados = new ArrayList<SolicitudCandidatoDto>();
			SolicitudCandidatoDao dao = this.getDaoFactory().newDao(SolicitudCandidatoDao.class);

			for (SolicitudCandidato solicitudCandidato : dao.getSolicitudesCandidatosByIdSolicitud(idSolicitudIngreso)) {

				SolicitudCandidatoDto dto = new SolicitudCandidatoDto();
				dto.setCandidatoDto(this.candidatoService.getCandidatoDto(solicitudCandidato.getCandidato()));
				dto.setEstadoRelacionId(solicitudCandidato.getEstadoSolicitudCandidato().getId());
				dto.setEstadoRelacionDescripcion(solicitudCandidato.getEstadoSolicitudCandidato().getDescripcion());
				dto.setSolicitudIngresoDto(this.solicitudIngresoService.getSolicitudDtoPorId(solicitudCandidato
						.getSolicitudIngreso().getId()));
				postulantesAsociados.add(dto);
			}

			return postulantesAsociados;

		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}

	public SolicitudCandidato getPostulanteAsociado(
			Long solicitudIngresoId, Long candidatoId) throws ServiceException {

		try {

			SolicitudCandidatoDao dao = this.getDaoFactory().newDao(SolicitudCandidatoDao.class);
			return dao.getSolicitudesCandidatosByIdSolicitudAndCandidatoId(solicitudIngresoId,candidatoId);

		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}
}